package io.renren.common.utils;
import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;



import com.google.gson.Gson;

import com.google.gson.GsonBuilder;
import io.renren.modules.courseTest.controller.courseTestController;
import org.apache.commons.logging.Log;
import org.apache.log4j.Logger;

import org.apache.commons.logging.LogFactory;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.ss.usermodel.Cell;

import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.ss.usermodel.Workbook;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import org.springframework.web.multipart.MultipartFile;



/**

 * Created by Lenovo on 2018/1/21.

 */

public class ReadExcel {

    //private static final Log logger = LogFactory.getLog(courseTestController.class);
    private static final Gson gson = new GsonBuilder().serializeNulls().create();
    private final static String xls = "xls";
    private final static String xlsx = "xlsx";



    /**

     * 读入excel文件，解析后返回

     * @param file

     * @throws IOException

     */

    public List readExcel(MultipartFile file) throws IOException{

        //检查文件

        checkFile(file);

        //获得Workbook工作薄对象

        Workbook workbook = getWorkBook(file);

        //创建返回对象，把每行中的值作为一个数组，所有行作为一个集合返回

        List<String[]> list = new ArrayList();

        if(workbook != null){

            for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){

                //获得当前sheet工作表

                Sheet sheet = workbook.getSheetAt(sheetNum);

                if(sheet == null){

                    continue;

                }

                //获得当前sheet的开始行

                int firstRowNum  = sheet.getFirstRowNum();

                //获得当前sheet的结束行

                int lastRowNum = sheet.getLastRowNum();

                //循环除了第一行的所有行
            //todo firstRowNum需要+1
                for(int rowNum = firstRowNum+1;rowNum <= lastRowNum;rowNum++){ //为了过滤到第一行因为我的第一行是数据库的列

                    //获得当前行

                    Row row = sheet.getRow(rowNum);

                    if(row == null){

                        continue;

                    }

                    //获得当前行的开始列

                    int firstCellNum = row.getFirstCellNum();

                    //获得当前行的列数

                    int lastCellNum = row.getLastCellNum();//为空列获取

//                    int lastCellNum = row.getPhysicalNumberOfCells();//为空列不获取

//                    String[] cells = new String[row.getPhysicalNumberOfCells()];

                    String[] cells = new String[row.getLastCellNum()];

                    //循环当前行

                    for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){

                        Cell cell = row.getCell(cellNum);

                        cells[cellNum] = getCellValue(cell);

                    }

                    list.add(cells);

                }

            }

        }

        //logger.info(gson.toJson(list));

        return list;

    }

    public void checkFile(MultipartFile file) throws IOException{

        //判断文件是否存在

        if(null == file){



            throw new FileNotFoundException("文件不存在！");

        }

        //获得文件名

        String fileName = file.getOriginalFilename();

        //判断文件是否是excel文件

        if(!fileName.endsWith(xls) && !fileName.endsWith(xlsx)){

            throw new IOException(fileName + "不是excel文件");

        }

    }

    public Workbook getWorkBook(MultipartFile file) {

        //获得文件名

        String fileName = file.getOriginalFilename();

        //创建Workbook工作薄对象，表示整个excel

        Workbook workbook = null;

        try {

            //获取excel文件的io流

            InputStream is = file.getInputStream();

            //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象

            if(fileName.endsWith(xls)){

                //2003

                workbook = new HSSFWorkbook(is);

            }else if(fileName.endsWith(xlsx)){

                //2007

                workbook = new XSSFWorkbook(is);

            }

        } catch (IOException e) {

            //logger.info(e.getMessage());
            e.printStackTrace();

        }

        return workbook;

    }

    public String getCellValue(Cell cell){

        String cellValue = "";

        if(cell == null){

            return cellValue;

        }

        //把数字当成String来读，避免出现1读成1.0的情况

        if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){

            cell.setCellType(Cell.CELL_TYPE_STRING);

        }

        //判断数据的类型

        switch (cell.getCellType()){

            case Cell.CELL_TYPE_NUMERIC: //数字

                cellValue = String.valueOf(cell.getNumericCellValue());

                break;

            case Cell.CELL_TYPE_STRING: //字符串

                cellValue = String.valueOf(cell.getStringCellValue());

                break;

            case Cell.CELL_TYPE_BOOLEAN: //Boolean

                cellValue = String.valueOf(cell.getBooleanCellValue());

                break;

            case Cell.CELL_TYPE_FORMULA: //公式

//                cellValue = String.valueOf(cell.getCellFormula());

                cellValue = String.valueOf(cell.getStringCellValue());

                break;

            case Cell.CELL_TYPE_BLANK: //空值

                cellValue = "";

                break;

            case Cell.CELL_TYPE_ERROR: //故障

                cellValue = "非法字符";

                break;

            default:

                cellValue = "未知类型";

                break;

        }

        return cellValue;

    }

}


